package model;

import java.io.File;
import java.io.FileWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLProcessor
{
	private Document doc; 
	
	public XMLProcessor(String conteudo)
	{
		try
		{
			DocumentBuilderFactory b = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = b.newDocumentBuilder();

			String arquivoDeEntrada = "arquivoRecebido.xml";
			File arquivoRecebido = new File(arquivoDeEntrada);
			arquivoRecebido.createNewFile();

			FileWriter fileWriter = new FileWriter(arquivoRecebido);
			fileWriter.write(conteudo);
			fileWriter.close();

			// Parse the document
			this.doc = builder.parse(arquivoRecebido);

		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public String process()
	{
		NodeList nodeListCheque = this.doc.getElementsByTagName("cheque");
		NodeList nodeListDoc = this.doc.getElementsByTagName("doc");
		String resposta = "";

		resposta = transformaArquivoCheques(nodeListCheque);
		resposta += transformaArquivoDocs(nodeListDoc);
		
		return resposta;		
		
	}

	private String transformaArquivoCheques(NodeList nodeListCheque)
	{
		String resposta = "";
		
		for (int i = 0; i < nodeListCheque.getLength(); i++)
		{
			Node no = nodeListCheque.item(i);
			NodeList filhosDeCheque = no.getChildNodes();
			Cheque cheque = new Cheque();
			
			for (int j = 0; j < filhosDeCheque.getLength(); j++)
			{
				Node node = filhosDeCheque.item(j);
				
				if ("agencia".equals(node.getNodeName()))
				{
					cheque.setAgenciaEmissor(Integer.parseInt(node.getFirstChild().getNodeValue()));
				}
				else if ("conta".equals(node.getNodeName()))
				{
					cheque.setContaCorrenteEmissor(Integer.parseInt(node.getFirstChild().getNodeValue()));
				}
				else if ("valor".equals(node.getNodeName()))
				{
					cheque.setValor(Double.parseDouble(node.getFirstChild().getNodeValue()));
				}
				else if ("numCheque".equals(node.getNodeName()))
				{
					cheque.setNumero(Long.parseLong(node.getFirstChild().getNodeValue()));
				}
			}

			if (cheque.descontar().equalsIgnoreCase("OK")) //TODO
			{
				resposta += "Cheque '" + cheque.getNumero() + "' descontado com sucesso!\n";
				System.out.println(resposta);				
			}
			else
			{
				resposta += "Cheque '" + cheque.getNumero() + "' nao descontado!\n";
				System.out.println(resposta);
			}
			
		}
		
		return resposta;
	}

	private String transformaArquivoDocs(NodeList nodeListDoc)
	{
		String resposta = "";
		
		for (int i = 0; i < nodeListDoc.getLength(); i++)
		{
			Node no = nodeListDoc.item(i);
			NodeList filhosDeDoc = no.getChildNodes();
			Doc doc = new Doc();
			
			for (int j = 0; j < filhosDeDoc.getLength(); j++)
			{
				Node node = filhosDeDoc.item(j);
				
				if ("agencia".equals(node.getNodeName()))
				{
					doc.setAgenciaEmissor(Integer.parseInt(node.getFirstChild().getNodeValue()));
				}
				else if ("conta".equals(node.getNodeName()))
				{
					doc.setContaCorrenteEmissor(Long.parseLong(node.getFirstChild().getNodeValue()));
				}
				else if ("valor".equals(node.getNodeName()))
				{
					doc.setValor(Double.parseDouble(node.getFirstChild().getNodeValue()));
				}
				else if ("numDoc".equals(node.getNodeName()))
				{
					doc.setNumero(Long.parseLong(node.getFirstChild().getNodeValue()));
				}
			}

			if (doc.descontar().equalsIgnoreCase("OK")) //TODO
			{
				resposta += "Doc '" + doc.getNumero() + "' descontado com sucesso!\n";
				System.out.println(resposta);				
			}
			else
			{
				resposta += "Doc '" + doc.getNumero() + "' nao descontado!\n";
				System.out.println(resposta);
			}
			
		}
		
		return resposta;
	}
	

	public Document getDoc()
	{
		return doc;
	}

	
	public void setDoc(Document doc)
	{
		this.doc = doc;
	}
}
